{$CLEO .cs}
{$USE CLEO+}

SCRIPT_NAME 'PTRLCAN'

IF IS_ON_SAMP
THEN
    TERMINATE_THIS_CUSTOM_SCRIPT
END

WHILE NOT IS_PLAYER_PLAYING 0
    WAIT 0
END

WAIT 100

//***********************************************************************************//
///////////////////////////////////////////////////////////////////////////////////////
// Petrol Can Weapon
// Author: AlvarynGTA
///////////////////////////////////////////////////////////////////////////////////////
//
// Weapon controller for the petrol can.
//
// Handles:
// - weapon detection and custom render states
// - pouring audio and droplet FX
// - oil spawn requests sent to OilCore
// - ammo consumption logic
//
// Architecture:
// This script depends on OilCore being initialized first,
// since OilRequestPtr is obtained from OilCore runtime memory.
//
// Safety:
// Supports shared 2-player mode.
// Includes forced render/audio cleanup on player deletion and save confirmation
// to prevent engine crashes or leftover runtime state.
//
//***********************************************************************************//

CONST
    // -------------------------------------------------------------------------
    // State machine
    // Used by: PetrolCanWeapon
    // -------------------------------------------------------------------------
    STATE_NONE = 0
    STATE_HAND_FIX = 1
    STATE_FIRE = 2

    // -------------------------------------------------------------------------
    // WEAPON_CONFIG_BUFFER layout
    // Used by: PetrolCanWeapon
    // -------------------------------------------------------------------------
    CFG_WEAPON_ID = 0x00               // Weapon detection / ammo / model removal
    CFG_AMMO_INTERVAL = 0x04           // Oil request interval and ammo consumption timing
    CFG_ENABLE_AUDIO = 0x08            // Audio enable flag
    CFG_AUDIO_VOLUME = 0x0C            // Pouring audio volume

    CFG_OIL_TARGET_OFFSET_X = 0x10     // Oil spawn target offset X
    CFG_OIL_TARGET_OFFSET_Y = 0x14     // Oil spawn target offset Y

    CFG_ENABLE_DROPLETS = 0x18         // Droplet FX enable flag
    CFG_NOZZLE_OFFSET_X = 0x1C         // Droplet nozzle offset X
    CFG_NOZZLE_OFFSET_Y = 0x20         // Droplet nozzle offset Y
    CFG_NOZZLE_OFFSET_Z = 0x24         // Droplet nozzle offset Z

    CFG_PARTICLE_RED = 0x28            // Droplet particle red
    CFG_PARTICLE_GREEN = 0x2C          // Droplet particle green
    CFG_PARTICLE_BLUE = 0x30           // Droplet particle blue
    CFG_PARTICLE_ALPHA = 0x34          // Droplet particle alpha
    CFG_PARTICLE_SIZE = 0x38           // Droplet particle size

    CFG_DROPLET_SPEED_FACTOR = 0x3C    // Derived runtime droplet velocity scale

    // -------------------------------------------------------------------------
    // OilCore request buffer layout
    // Used by: PetrolCanWeapon, OilCore
    // -------------------------------------------------------------------------
    REQ_POS_XYZ = 0x00                 // Weapon writes / OilCore reads oil request position
    REQ_OWNER_CHAR = 0x0C              // Weapon writes / OilCore reads ped owner handle
    REQ_FLAG = 0x10                    // Weapon writes / OilCore reads-clears request trigger

    // -------------------------------------------------------------------------
    // Native addresses
    // Used by: PetrolCanWeapon
    // -------------------------------------------------------------------------
    CPed__RemoveWeaponModel = 0x5E3990 // Removes vanilla weapon model before custom render
END

// Shared buffers
INT weaponConfigPtr, oilRequestPtr

// Runtime player state
INT playerID, userChar, ammo
INT state[2], canRender[2], audioPlaying[2]
INT charPlayer[2], deletedChar, saveSlot

// Audio / models
INT petrolAudio[2], petrolAudioLoaded
INT specialHand, specialThrow

// Internal helpers
INT pPed
FLOAT x, y, z

// INI / temp config
INT tempInt
FLOAT tempFloat, tempFloat2

//***********************************************************************************//

GET_LABEL_POINTER @WEAPON_CONFIG_BUFFER weaponConfigPtr
GOSUB @read_INI

state[0] = STATE_NONE
state[1] = STATE_NONE

canRender[0] = 0
canRender[1] = 0

audioPlaying[0] = FALSE
audioPlaying[1] = FALSE

charPlayer[0] = -1
charPlayer[1] = -1

petrolAudioLoaded = FALSE

TIMERA = 0
TIMERB = 0

specialHand = LOAD_SPECIAL_MODEL "CLEO\PetrolCan\petrolcan_hand" "CLEO\PetrolCan\petrolcan_texture"
specialThrow = LOAD_SPECIAL_MODEL "CLEO\PetrolCan\petrolcan_throw" "CLEO\PetrolCan\petrolcan_texture"

tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_ENABLE_AUDIO 4
IF AND
    tempInt == TRUE
    DOES_FILE_EXIST "CLEO\PetrolCan\petrolcan_pour_loop.wav"
THEN
    petrolAudio[0] = LOAD_3D_AUDIO_STREAM "CLEO\PetrolCan\petrolcan_pour_loop.wav"
    petrolAudio[1] = LOAD_3D_AUDIO_STREAM "CLEO\PetrolCan\petrolcan_pour_loop.wav"

    tempFloat = READ_STRUCT_OFFSET weaponConfigPtr CFG_AUDIO_VOLUME 4

    SET_AUDIO_STREAM_VOLUME petrolAudio[0] tempFloat
    SET_AUDIO_STREAM_VOLUME petrolAudio[1] tempFloat

    SET_AUDIO_STREAM_LOOPED petrolAudio[0] TRUE
    SET_AUDIO_STREAM_LOOPED petrolAudio[1] TRUE

    petrolAudioLoaded = TRUE
END

SET_SCRIPT_EVENT_CHAR_DELETE TRUE @on_char_delete_EVENT deletedChar
SET_SCRIPT_EVENT_SAVE_CONFIRMATION TRUE @on_save_confirm_EVENT saveSlot

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//-----------------------------------------------------------------------------//
:MAIN_LOOP
//-----------------------------------------------------------------------------//
WAIT 0

FOR playerID = 0 TO 1
    userChar = GET_PLAYER_CHAR playerID

    IF AND
        userChar > -1
        DOES_CHAR_EXIST userChar
    THEN
        charPlayer[playerID] = userChar // Store last valid player ped handle for safe cleanup during char delete events
        GOSUB @check_has_petrolcan
    ELSE
        GOSUB @state_cleanup
    END
END

JUMP @MAIN_LOOP

//-----------------------------------------------------------------------------//
:on_char_delete_EVENT
//-----------------------------------------------------------------------------//
// Cleanup weapon runtime state immediately before player deletion.
// Prevents crash when player 2 respawns after disappearing while holding the weapon.

IF deletedChar == charPlayer[0]
THEN
    playerID = 0
    GOSUB @state_cleanup
    charPlayer[0] = -1
END

IF deletedChar == charPlayer[1]
THEN
    playerID = 1
    GOSUB @state_cleanup
    charPlayer[1] = -1
END

RETURN_SCRIPT_EVENT

//-----------------------------------------------------------------------------//
:on_save_confirm_EVENT
//-----------------------------------------------------------------------------//
// Cleanup weapon runtime state before saving.
// Prevents render/audio leftovers from being captured during save.

FOR playerID = 0 TO 1
    GOSUB @state_cleanup
END

RETURN_SCRIPT_EVENT

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//_______________________________________________________________
:check_has_petrolcan
//_______________________________________________________________
tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_WEAPON_ID 4

IF AND
    NOT IS_CHAR_DEAD userChar
    IS_CURRENT_CHAR_WEAPON userChar tempInt
THEN
    GOSUB @state_equipped
ELSE
    GOSUB @state_cleanup
END

RETURN

//_______________________________________________________________
:state_equipped
//_______________________________________________________________
GOSUB @remove_real_weapon_model

IF IS_CHAR_PLAYING_ANIM userChar "FLAME_fire"
THEN
    GOSUB @state_fire
ELSE
    GOSUB @state_hand_fix
END

RETURN

//_______________________________________________________________
:state_hand_fix
//_______________________________________________________________
IF state[playerID] <> STATE_HAND_FIX
THEN
    GOSUB @stop_petrol_audio
    GOSUB @clear_can_render
    GOSUB @create_hand_render

    state[playerID] = STATE_HAND_FIX
END

RETURN

//_______________________________________________________________
:state_fire
//_______________________________________________________________
IF state[playerID] <> STATE_FIRE
THEN
    GOSUB @clear_can_render
    GOSUB @create_fire_render
    GOSUB @start_petrol_audio

    IF playerID == 0
    THEN
        TIMERA = 0
    ELSE
        TIMERB = 0
    END

    state[playerID] = STATE_FIRE
END

tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_ENABLE_DROPLETS 4
IF tempInt == TRUE
THEN
    CREATE_POUR_DROPLETS(userChar, weaponConfigPtr)
END

tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_AMMO_INTERVAL 4

IF playerID == 0
THEN
    IF TIMERA < tempInt
    THEN RETURN
    END
ELSE
    IF TIMERB < tempInt
    THEN RETURN
    END
END

tempFloat = READ_STRUCT_OFFSET weaponConfigPtr CFG_OIL_TARGET_OFFSET_X 4
tempFloat2 = READ_STRUCT_OFFSET weaponConfigPtr CFG_OIL_TARGET_OFFSET_Y 4

x, y, z = GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS userChar tempFloat tempFloat2 0.0
z = GET_GROUND_Z_FOR_3D_COORD x y z
z += 0.10

GOSUB @send_oil_request

IF AND
    NOT IS_CHEAT_ACTIVE 72
    $GAME_COMPLETE == 0
THEN
    tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_WEAPON_ID 4

    ADD_AMMO_TO_CHAR userChar tempInt -1
    GET_AMMO_IN_CHAR_WEAPON userChar tempInt ammo

    IF ammo <= 0
    THEN
        REMOVE_WEAPON_FROM_CHAR userChar tempInt
        GOSUB @state_cleanup
    END
END

IF playerID == 0
THEN
    TIMERA = 0
ELSE
    TIMERB = 0
END

RETURN

//_______________________________________________________________
:state_cleanup
//_______________________________________________________________
IF state[playerID] <> STATE_NONE
THEN
    GOSUB @stop_petrol_audio
    GOSUB @clear_can_render

    state[playerID] = STATE_NONE
END

RETURN

//_______________________________________________________________
:send_oil_request
//_______________________________________________________________
IF oilRequestPtr <> 0
THEN
    WRITE_STRUCT_OFFSET_MULTI oilRequestPtr REQ_POS_XYZ 3 4 x y z
    WRITE_STRUCT_OFFSET oilRequestPtr REQ_OWNER_CHAR 4 userChar
    WRITE_STRUCT_OFFSET oilRequestPtr REQ_FLAG 4 TRUE
END

RETURN

//_______________________________________________________________
:remove_real_weapon_model
//_______________________________________________________________
tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_WEAPON_ID 4
tempInt = GET_WEAPONTYPE_MODEL tempInt

pPed = GET_PED_POINTER userChar
CALL_METHOD CPed__RemoveWeaponModel pPed 1 0 tempInt

RETURN

//_______________________________________________________________
:create_hand_render
//_______________________________________________________________
// Known engine issue: CREATE_RENDER_OBJECT_TO_CHAR_BONE_FROM_SPECIAL may crash if player 2 disappears and respawns while holding the weapon.
// Fixed by forcing render cleanup in the char delete event before the ped is destroyed.
IF canRender[playerID] == 0
THEN
    canRender[playerID] = CREATE_RENDER_OBJECT_TO_CHAR_BONE_FROM_SPECIAL userChar specialHand PedBone.RightWrist 0.0 0.0 0.0 0.0 0.0 0.0
END

RETURN

//_______________________________________________________________
:create_fire_render
//_______________________________________________________________
// Known engine issue: CREATE_RENDER_OBJECT_TO_CHAR_BONE_FROM_SPECIAL may crash if player 2 disappears and respawns while holding the weapon.
// Fixed by forcing render cleanup in the char delete event before the ped is destroyed.
IF canRender[playerID] == 0
THEN
    canRender[playerID] = CREATE_RENDER_OBJECT_TO_CHAR_BONE_FROM_SPECIAL userChar specialThrow PedBone.RightWrist 0.0 0.0 0.0 0.0 0.0 0.0
END

RETURN

//_______________________________________________________________
:clear_can_render
//_______________________________________________________________
IF canRender[playerID] <> 0
THEN
    DELETE_RENDER_OBJECT canRender[playerID]
    canRender[playerID] = 0
END

RETURN

//_______________________________________________________________
:start_petrol_audio
//_______________________________________________________________
IF petrolAudioLoaded == TRUE
THEN
    IF audioPlaying[playerID] == FALSE
    THEN
        SET_PLAY_3D_AUDIO_STREAM_AT_CHAR petrolAudio[playerID] userChar
        SET_AUDIO_STREAM_STATE petrolAudio[playerID] AudioStreamAction.Play
        audioPlaying[playerID] = TRUE
    END
END

RETURN

//_______________________________________________________________
:stop_petrol_audio
//_______________________________________________________________
IF petrolAudioLoaded == TRUE
THEN
    IF audioPlaying[playerID] == TRUE
    THEN
        SET_AUDIO_STREAM_STATE petrolAudio[playerID] AudioStreamAction.Stop
        audioPlaying[playerID] = FALSE
    END
END

RETURN

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//_______________________________________________________________
FUNCTION CREATE_POUR_DROPLETS(ownerChar: INT, weaponConfigPtr: INT)
    FLOAT fxX, fxY, fxZ
    FLOAT targetX, targetY, targetZ
    FLOAT velX, velY, velZ

    FLOAT tmp1, tmp2, tmp3, tmp4, tmp5

    tmp1 = READ_STRUCT_OFFSET weaponConfigPtr CFG_OIL_TARGET_OFFSET_X 4
    tmp2 = READ_STRUCT_OFFSET weaponConfigPtr CFG_OIL_TARGET_OFFSET_Y 4

    targetX, targetY, targetZ = GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS ownerChar tmp1 tmp2 0.0
    targetZ = GET_GROUND_Z_FOR_3D_COORD targetX targetY targetZ
    targetZ += 0.10

    tmp1 = READ_STRUCT_OFFSET weaponConfigPtr CFG_NOZZLE_OFFSET_X 4
    tmp2 = READ_STRUCT_OFFSET weaponConfigPtr CFG_NOZZLE_OFFSET_Y 4
    tmp3 = READ_STRUCT_OFFSET weaponConfigPtr CFG_NOZZLE_OFFSET_Z 4

    fxX, fxY, fxZ = GET_OFFSET_FROM_CHAR_IN_WORLD_COORDS ownerChar tmp1 tmp2 tmp3

    tmp1 = READ_STRUCT_OFFSET weaponConfigPtr CFG_DROPLET_SPEED_FACTOR 4

    velZ = targetZ
    velZ -= fxZ
    velZ *= tmp1

    velX = targetX
    velX -= fxX
    velX *= tmp1

    velY = targetY
    velY -= fxY
    velY *= tmp1

    tmp1 = READ_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_RED 4
    tmp2 = READ_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_GREEN 4
    tmp3 = READ_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_BLUE 4
    tmp4 = READ_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_ALPHA 4
    tmp5 = READ_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_SIZE 4

    ADD_SMOKE_PARTICLE fxX fxY fxZ velX velY velZ tmp1 tmp2 tmp3 tmp4 tmp5 0.05
END

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//=========================================================================//
:read_INI
//=========================================================================//
IF NOT DOES_FILE_EXIST "CLEO\PetrolCan.ini"
THEN
    PRINT_STRING_NOW "~r~PetrolCan.ini missing" 5000
    TERMINATE_THIS_CUSTOM_SCRIPT
END

// ==================================================
// [Settings]
// ==================================================
IF NOT READ_INT_FROM_INI_FILE "CLEO\PetrolCan.ini" "Settings" "EnableMod" tempInt
THEN
    tempInt = 0
END

IF tempInt <> 1
THEN
    TERMINATE_THIS_CUSTOM_SCRIPT
END

// ==================================================
// [RuntimeMemory] - OilCore public API
// ==================================================
IF NOT READ_INT_FROM_INI_FILE "CLEO\OilProperties.ini" "RuntimeMemory" "OilRequestPtr" oilRequestPtr
THEN
    oilRequestPtr = 0
END

IF oilRequestPtr == 0
THEN
    PRINT_STRING_NOW "~r~OilCore runtime memory not initialized" 5000
    TERMINATE_THIS_CUSTOM_SCRIPT
END

// ==================================================
// [Weapon]
// ==================================================
IF NOT READ_INT_FROM_INI_FILE "CLEO\PetrolCan.ini" "Weapon" "WeaponID" tempInt
THEN
    tempInt = 42
END

IF tempInt <= -1
THEN
    tempInt = 42
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_WEAPON_ID 4 tempInt

IF NOT READ_INT_FROM_INI_FILE "CLEO\PetrolCan.ini" "Weapon" "AmmoInterval" tempInt
THEN
    tempInt = 150
END

IF tempInt < 50
THEN
    tempInt = 50
END

IF tempInt > 1000
THEN
    tempInt = 1000
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_AMMO_INTERVAL 4 tempInt

// ==================================================
// [Audio]
// ==================================================
IF NOT READ_INT_FROM_INI_FILE "CLEO\PetrolCan.ini" "Audio" "EnableAudio" tempInt
THEN
    tempInt = 1
END

IF tempInt <> 1
THEN
    tempInt = 0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_ENABLE_AUDIO 4 tempInt

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "Audio" "Volume" tempFloat
THEN
    tempFloat = 0.5
END

IF tempFloat < 0.0
THEN
    tempFloat = 0.0
END

IF tempFloat > 1.0
THEN
    tempFloat = 1.0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_AUDIO_VOLUME 4 tempFloat

// ==================================================
// [OilSpawn]
// ==================================================
IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "OilSpawn" "TargetOffsetX" tempFloat
THEN
    tempFloat = 0.40
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_OIL_TARGET_OFFSET_X 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "OilSpawn" "TargetOffsetY" tempFloat
THEN
    tempFloat = 0.75
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_OIL_TARGET_OFFSET_Y 4 tempFloat

// ==================================================
// [PourFX]
// ==================================================
IF NOT READ_INT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "EnableDroplets" tempInt
THEN
    tempInt = 1
END

IF tempInt <> 1
THEN
    tempInt = 0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_ENABLE_DROPLETS 4 tempInt

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "NozzleOffsetX" tempFloat
THEN
    tempFloat = 0.32
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_NOZZLE_OFFSET_X 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "NozzleOffsetY" tempFloat
THEN
    tempFloat = 0.35
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_NOZZLE_OFFSET_Y 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "NozzleOffsetZ" tempFloat
THEN
    tempFloat = -0.03
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_NOZZLE_OFFSET_Z 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "ParticleRed" tempFloat
THEN
    tempFloat = 0.02
END

IF tempFloat < 0.0
THEN
    tempFloat = 0.0
END

IF tempFloat > 1.0
THEN
    tempFloat = 1.0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_RED 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "ParticleGreen" tempFloat
THEN
    tempFloat = 0.02
END

IF tempFloat < 0.0
THEN
    tempFloat = 0.0
END

IF tempFloat > 1.0
THEN
    tempFloat = 1.0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_GREEN 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "ParticleBlue" tempFloat
THEN
    tempFloat = 0.02
END

IF tempFloat < 0.0
THEN
    tempFloat = 0.0
END

IF tempFloat > 1.0
THEN
    tempFloat = 1.0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_BLUE 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "ParticleAlpha" tempFloat
THEN
    tempFloat = 1.0
END

IF tempFloat < 0.0
THEN
    tempFloat = 0.0
END

IF tempFloat > 1.0
THEN
    tempFloat = 1.0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_ALPHA 4 tempFloat

IF NOT READ_FLOAT_FROM_INI_FILE "CLEO\PetrolCan.ini" "PourFX" "ParticleSize" tempFloat
THEN
    tempFloat = 0.025
END

IF tempFloat < 0.001
THEN
    tempFloat = 0.001
END

IF tempFloat > 1.0
THEN
    tempFloat = 1.0
END

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_PARTICLE_SIZE 4 tempFloat

// ==================================================
// [Derived Runtime Values]
// ==================================================
tempInt = READ_STRUCT_OFFSET weaponConfigPtr CFG_AMMO_INTERVAL 4

tempFloat2 =# tempInt
tempFloat2 -= 50.0

IF tempFloat2 < 50.0
THEN
    tempFloat2 = 50.0
END

tempFloat = 1000.0
tempFloat /= tempFloat2

WRITE_STRUCT_OFFSET weaponConfigPtr CFG_DROPLET_SPEED_FACTOR 4 tempFloat

RETURN

//-----------------------------------------------------------------------------------//
///////////////////////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------------//

//=========================================================================//
:WEAPON_CONFIG_BUFFER
//=========================================================================//
HEX
    00 (64)
END